
#基于FLANN的匹配器(FLANN based Matcher)定位图片
import numpy as np
import cv2
MIN_MATCH_COUNT = 7 #设置最低特征点匹配数量为10

def findbackgroud(target,path):
    
    #降噪（模糊处理用来减少瑕疵点）
    #result = cv2.blur(find_target, (5,5))
    #灰度化,就是去色（类似老式照片）
    #target=cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)
    # Initiate SIFT detector创建sift检测器
    sift = cv2.xfeatures2d.SIFT_create()
    #创建设置FLANN匹配
    FLANN_INDEX_KDTREE = 0
    index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
    search_params = dict(checks = 50)
    flann = cv2.FlannBasedMatcher(index_params, search_params)
    find_count=0
    for tp in ['b1','b2','b3','b4','b5','b6']: 
        template_before = cv2.imread(path+tp+'.jpg') # queryImage
        #灰度化,就是去色（类似老式照片）
        template_result=cv2.cvtColor(template_before,cv2.COLOR_BGR2GRAY)
        #降噪（模糊处理用来减少瑕疵点）
        template = cv2.blur(template_result, (5,5))
        #retval, template =cv2.threshold(template1, 0, 255, cv2.THRESH_OTSU)

        good = []
        # find the keypoints and descriptors with SIFT
        kp1, des1 = sift.detectAndCompute(template,None)
        kp2, des2 = sift.detectAndCompute(target,None)
        matches = flann.knnMatch(des1,des2,k=2)
        # store all the good matches as per Lowe's ratio test.
        #舍弃大于0.7的匹配
        for m,n in matches:
            if m.distance < 0.7*n.distance:
                good.append(m)
        if len(good)>=MIN_MATCH_COUNT:
            # 获取关键点的坐标
            src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
            dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
            #计算变换矩阵和MASK
            M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
            matchesMask = mask.ravel().tolist()
            h,w = template.shape
            # 使用得到的变换矩阵对原图像的四个角进行变换，获得在目标图像上对应的坐标
            pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
            dst = cv2.perspectiveTransform(pts,M)
            cv2.polylines(target,[np.int32(dst)],True,0,2, cv2.LINE_AA)
            find_count=find_count+1
        else:
           #print( "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT))
           matchesMask = None
        #draw_params = dict(matchColor=(0,255,0), 
        #                  singlePointColor=None,
        #                  matchesMask=matchesMask, 
        #                  flags=2)
        #result = cv2.drawMatches(template,kp1,target,kp2,good,None,**draw_params)
        #plt.imshow(result, 'gray')
        #plt.show()
    print(find_count)
    return find_count




